package git.soulbgm.utils;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;

/**
 * 文件操作类
 *
 * @author SoulBGM
 * @date 2018-07-17 15:58
 */
public class FileUtil {

    private static LogUtil log = new LogUtil(FileUtil.class);

//    private static final String SEPARATOR = File.separator;

    public static final String SEPARATOR = "/";

    /**
     * UTF-8字符集
     */
    public final static String CHARSET_UTF8 = "UTF-8";

    /**
     * GBK字符集
     */
    public final static String CHARSET_GBK = "GBK";

    /**
     * ISO-8859-1字符集
     */
    public final static String CHARSET_ISO = "ISO-8859-1";

    /**
     * 强制删除文件或文件夹
     *
     * @param path
     */
    public static void forceDelFile(String path) {
        try {
            FileUtils.forceDeleteOnExit(new File(path));
//            FileUtils.forceDelete(new File(path));
        } catch (IOException e) {
            log.info("强制删除“{}”出现错误", path, e);
        }
    }

    /**
     * 平静删除文件或文件夹，就是说如果有资源占用是不会删除的
     *
     * @param path
     * @return
     */
    public static boolean delFile(String path) {
        return FileUtils.deleteQuietly(new File(path));
    }

    /**
     * 删除文件夹，文件不删除
     *
     * @param path
     */
    public static void delDir(String path) {
        try {
            File dir = new File(path);
            if (dir != null && dir.isDirectory()) {
                FileUtils.deleteDirectory(dir);
            }
        } catch (IOException e) {
            log.info("删除文件夹“{}”出现错误", path, e);
        }
    }

    /**
     * 获得系统的临时目录
     *
     * @return
     */
    public static String getTmpDir() {
        return System.getProperty("java.io.tmpdir");
    }

    /**
     * 创建文件夹
     * 如果有则不创建，没有则创建
     *
     * @param folder
     * @return
     */
    public static boolean createFolder(String folder) {
        return createFolder(new File(folder));
    }

    /**
     * 创建文件夹
     * 如果有则不创建，没有则创建
     *
     * @param folder
     * @return
     */
    public static boolean createFolder(File folder) {
        if (folder == null) {
            return false;
        }
        if (exist(folder)) {
            return true;
        }
        File parentFile = folder.getParentFile();
        boolean flag = false;
        if (parentFile != null) {
            if (exist(parentFile)) {
                flag = true;
            } else {
                flag = parentFile.mkdirs();
            }
            if (flag) {
                return folder.mkdirs();
            }
        }
        return false;
    }

    /**
     * 文件是否存在
     *
     * @param file
     * @return
     */
    public static boolean exist(File file) {
        if (file != null) {
            return file.exists();
        }
        return false;
    }

    /**
     * 创建文件
     * 如果有则不创建，没有则创建
     *
     * @param file
     * @return
     */
    public static boolean createFile(String file) {
        return createFile(new File(file));
    }

    /**
     * 创建文件
     * 如果有则不创建，没有则创建
     *
     * @param file
     * @return
     */
    public static boolean createFile(File file) {
        if (file == null) {
            return false;
        }
        if (exist(file)) {
            return true;
        }
        File parentFile = file.getParentFile();
        boolean flag = false;
        if (parentFile != null) {
            if (exist(parentFile)) {
                flag = true;
            } else {
                flag = parentFile.mkdirs();
            }
            try {
                if (flag) {
                    return file.createNewFile();
                }
            } catch (IOException e) {
                return false;
            }
        }
        return false;
    }

    /**
     * 判断file是否是文件
     *
     * @param file
     * @return
     */
    public static boolean isFile(File file) {
        if (file != null && file.exists() && file.isFile()) {
            return true;
        }
        return false;
    }

    /**
     * 生成路径
     *
     * @return
     */
    public static String createPath(boolean flag, String... name) {
        String beginStr = "";
        if (flag) {
            beginStr = SEPARATOR;
        }
        StringBuilder sb = new StringBuilder(beginStr);
        for (String n : name) {
            sb.append(n + SEPARATOR);
        }
        sb.delete(sb.length() - SEPARATOR.length(), sb.length());
        return sb.toString();
    }

}
